package sistema;

import controloBD.AcessoBD;
import controloBD.QueryResult;
import java.util.Date;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

public class Transaccao {

    private Long id_transacao;
    private double quantia;
    private String tipo;
    private String data;
    private Long id_utilizador;
    AcessoBD conexao;

    public Transaccao(Long id, String data, double valor, String tipo, Long id_utilizador) {
        this.id_transacao = id;
        this.quantia = valor;
        this.tipo = tipo;
        this.data = data;
        this.id_utilizador = id_utilizador;

    }

    private Transaccao(Vector tabela) {
        this.id_transacao = (Long) tabela.get(0);
        this.quantia = (Double) tabela.get(1);
        this.tipo = (String) tabela.get(2);
        this.data = (String) tabela.get(3);
        this.id_utilizador = (Long) tabela.get(4);
    }

    /**
     * @return the id_transacao
     */
    public Long getId_transacao() {
        return id_transacao;
    }

    /**
     * @return the valor
     */
    public double getValor() {
        return quantia;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(double valor) {
        this.quantia = valor;
    }

    /**
     * @return the tipo
     */
    public String getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    /**
     * @return the data
     */
    public String getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData(String data) {
        this.data = data;
    }

    /**
     * @return the id_utilizador
     */
    public Long getId_utilizador() {
        return id_utilizador;
    }

    /**
     * @param id_utilizador the id_utilizador to set
     */
    public void setId_utilizador(Long id_utilizador) {
        this.id_utilizador = id_utilizador;
    }

    public void connectBD() {
        conexao = new AcessoBD();
        conexao.carregaDriverEAbreConnection();
        conexao.abreStatement();
    }

    public void closeBD() {
        conexao.fechaStatement();
        conexao.fechaConnection();
    }

    public static void insereTransaccao(Hashtable params) throws Exception {
        AcessoBD conexao = new AcessoBD();
        String qryName = new String("inserir_nova_transaccao");
        conexao.executeSelect(qryName, params);
        conexao.closeBD();
    }

    public static Transaccao pesquisaTransaccao(Long id_transaccao) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dadosTransaccao = new Hashtable<String, String>();
        dadosTransaccao.put("var_idtransaccao", id_transaccao.toString());
        String qryName = new String("pesquisa_por_id_transaccao");
        QueryResult qr = new QueryResult();
        qr = conexao.executeSelect(qryName, dadosTransaccao);
        conexao.closeBD();
        return new Transaccao(qr.tabela());
    }

    public static List<Transaccao> seleccionarTodosDepositos(Long id_utilizador) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dadosTransaccao = new Hashtable<String, String>();
        dadosTransaccao.put("var_idutilizador", id_utilizador.toString());
        dadosTransaccao.put("var_tipo", "deposito");
        String qryName = new String("todos_transaccoes_porTipo");
        QueryResult qr = new QueryResult();
        qr = conexao.executeSelect(qryName, dadosTransaccao);
        conexao.closeBD();
        return converteTabela(qr);
    }

    public static List<Transaccao> seleccionarTodosLevantamentos(Long id_utilizador) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dadosTransaccao = new Hashtable<String, String>();
        dadosTransaccao.put("var_idutilizador", id_utilizador.toString());
        dadosTransaccao.put("var_tipo", "levantamento");
        String qryName = new String("todos_transaccoes_porTipo");
        QueryResult qr = new QueryResult();
        qr = conexao.executeSelect(qryName, dadosTransaccao);
        conexao.closeBD();
        return converteTabela(qr);
    }

    public static List<Transaccao> seleccionarTodos(Long id_utilizador) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dadosTransaccao = new Hashtable<String, String>();
        dadosTransaccao.put("var_idutilizador", id_utilizador.toString());
        String qryName = new String("todas_transaccoes");
        QueryResult qr = new QueryResult();
        qr = conexao.executeSelect(qryName, dadosTransaccao);
        conexao.closeBD();

        return converteTabela(qr);
    }

    public static List<Transaccao> converteTabela(QueryResult qr) {

        List<Transaccao> movimentos = new LinkedList<Transaccao>();
        if (!qr.tabela().isEmpty()) {
            int i = 0;
            while (i != qr.tabela().size()) {
                Long id_tran = (Long) qr.tabela().get(i);
                Double valor = (Double) qr.tabela().get(i + 1);
                String tipo = (String) qr.tabela().get(i + 2);
                String data = (String) qr.tabela().get(i + 3);
                Long id_utilizador = (Long) qr.tabela().get(i + 4);

                movimentos.add(new Transaccao(id_tran, data, valor, tipo, id_utilizador));
                i = i + 5;
            }
            return movimentos;
        }
        return null;
    }
}



